/**
 * @param {ListNode} headA
 * @param {ListNode} headB
 * @return {ListNode}
 */
var getIntersectionNode = function (headA, headB) {
  if (!headA || !headB) return null

  //双指针法：定义指针pA、pB，分别扫描链表pA、pB
  let pA = headA
  let pB = headB
  /*假设A链表的长度为a+c、B链表的长度为b+c，c为公共部分的长度：
  如果两个链表有公共部分，pA指针会走a+c+b部分，pB指针会走b+c+a部分，最终pA、pB均指向公共部分c的首节点
  如果两个链表没有公共部分，pA指针会走a+b部分，pB指针会走b+a部分，最终pA、pB同时指向链表B、A尾节点后面的null
  */
  while (pA !== pB) {
    pA = pA ? pA.next : headB
    pB = pB ? pB.next : headA
  }
  //返回pA或pB均可
  return pA
};